iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
DevOps

在後端漫遊,基礎N大建設系列 第 5

Day05 動手作配置管理(Config)

  • 分享至 

  • xImage
  •  

前言

昨日文章提到配置檔可以讓我們方便分開每個環境的設定,但是除了環境以外,我們也可以運用在同一份程式碼建置多個站別。

如何載入?

以下範例的程式碼可以在這邊下載

我們在下方開始動手實作如何載入配置檔,而我先選json格式作為檔案格式。

  1. 這邊先簡單描述一下資料夾架構 (如下圖)
/
|--- /config/ # <--- 存放配置檔的資料夾
|    |
|    |-- site_A.json
|    |-- site_B.json
|  
|
|-- main.go
  1. 先建立一個寫兩份檔案:site_A.jsonsite_B.json。資料結構如下:

    • site_A.json
    {
        "app": "Simple Server",
        "name": "Site A",
        "port": 8000,
        "db": {
            "username": "user_a",
            "password": "ajivx_vm@$JAIX"
        }
    }
    
    • site_B.json
    {
        "app": "Simple Server",
        "name": "Site B",
        "port": 8001,
        "db": {
            "username": "user_b",
            "password": "thI%^0rZi@"
        }
    }
    
  2. 再來是讀取檔案。雖然專業名詞是「載入配置」,說穿了也只是一般的開啟檔案、讀取檔案。

// 使用Go語言做讀檔動作
f, err := ioutil.ReadFile("config/site_A.json")
if err != nil {
    panic(err)
}
fmt.Println(string(f))
  1. 解析內容。依照資料進行解析,轉換成程式可用的變數。
// 定義配置資料結構
var configData struct {
    App  string `json:"app"`
    Name string `json:"Name"`
    Port int    `json:"port"`
    DB   struct {
        Username string `json:"username"`
        Password string `json:"password"`
    } `json:"db"`
}

// 使用JSON解碼
err = json.Unmarshal(f, &configData)
if err != nil {
    panic(err)
}

// 顯示配置資料
fmt.Println("Project Name", configData.Name)
// Output: Project Name Site A
  1. 以上步驟就完成了簡單的配置檔載入,接下來就直接應用了。
router := http.NewServeMux()
router.HandleFunc("/api-demo", func(w http.ResponseWriter, r *http.Request) {
    // 使用配置檔.第一式:在API加上
    w.Write([]byte("目前專案名稱是" + configData.Name))
})

// 使用配置檔.第二式:決定伺服器的Port
addr := fmt.Sprintf(":%d", configData.Port)
log.Println("開始建立伺服器 ", addr)
log.Fatal(http.ListenAndServe(addr, router))

// 使用配置檔.第三式:決定DB連線的帳密或IP
_ = fmt.Sprintf("connect database: username=%s password=%s",
    configData.DB.Username,
    configData.DB.Password,
)
  1. PO上完成圖

    • site A
      https://ithelp.ithome.com.tw/upload/images/20200905/20125815qQh4D3zdo9.png
    • site B
      https://ithelp.ithome.com.tw/upload/images/20200905/20125815fFiaytl1qv.png
  2. 雖然上述步驟已經完成載入與應用了,但是好像缺少了什麼?
    啊!那怎麼在啟動程式時,決定要採用哪一份檔案呢?
    有幾種做法:

    1. 透過環境變數,e.g. CONF_FILE=site_A [指令]
    2. 透過指令參數,e.g. [指令] site_A
    3. 透過讀取額外檔案,e.g. 程式碼先讀取 what_config.txt,這份檔案裡面定義site_A

而這邊,我們使用第一種做法「透過環境變數」

configFile := os.Getenv("CONF_FILE") // <--- 讀取環境變數,使用程式載入設定
f, err := ioutil.ReadFile("config/" + configFile + ".json") // +++ configFile
if err != nil {
    panic(err)
}
fmt.Println(string(f))

// ....以下省略

小結

配置檔(或稱設定檔)在眾多專案都佔著極其重要,但又容易被忽略的一個環節。其實配置檔觀念很簡單,只要善用配置管理,就能更善用同一份程式碼做更多的應用。
透過今日的載入配置範例,相信大家更進一步瞭解配置檔的應用。/images/emoticon/emoticon12.gif

ps. 由於最近工作繁忙,差點趕不上截止時間,所以先發表文章以免中斷,敬請見諒/images/emoticon/emoticon68.gif


上一篇
Day04 怎麼管理多個伺服器環境?
下一篇
Day06 只能API嗎?還有cmd!
系列文
在後端漫遊,基礎N大建設6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言